package com.flyqiu.form.api.store;


import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.flyqiu.common.mybaits.plus.FlyQiuQueryWrapper;
import com.flyqiu.form.common.exceptions.FlyQiuFormException;
import com.flyqiu.form.model.FlyQiuTableConfigModel;
import com.flyqiu.form.model.entity.FlyQiuTableConfig;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.exceptions.TooManyResultsException;

import java.util.List;

public interface StoreDataService extends BaseTableInfo {


    /**
     * 分页获取数据
     *
     * @param config 表单配置
     * @param page   分页信息
     * @param query  查询条件
     * @return {@link Page}
     */
    Page page(FlyQiuTableConfig config, Page page, FlyQiuQueryWrapper query);


    /**
     * 列表获取
     *
     * @param config 表单配置
     * @param query  查询条件
     * @return {@link JSONObject}
     */
    List<JSONObject> list(FlyQiuTableConfig config, FlyQiuQueryWrapper query);


    /**
     * 根据id获取数据
     *
     * @param tableId 表单id
     * @param dataId  数据id
     * @return {@link JSONObject}
     */
    default JSONObject getById(String tableId, String dataId) {
        FlyQiuTableConfigModel table = getTableConfigModel(tableId);
        return getById(table, dataId);
    }

    /**
     * 根据id获取数据
     *
     * @param config 表单配置
     * @param dataId 数据id
     * @return {@link JSONObject}
     */
    default JSONObject getById(FlyQiuTableConfig config, String dataId) {
        if (StringUtils.isEmpty(dataId)) {
            throw new FlyQiuFormException("dataId is not null or data is not empty");
        }
        FlyQiuQueryWrapper wrapper = new FlyQiuQueryWrapper();
        wrapper.eq(COLUMN_PK_NAME, dataId);
        return getOne(config, wrapper, true);
    }

    /**
     * 获取一个数据
     *
     * @param tableId 表单id
     * @param query   查询条件
     * @return {@link JSONObject}
     */
    default JSONObject getOne(String tableId, FlyQiuQueryWrapper query) {
        return getOne(tableId, query, true);
    }

    /**
     * 获取一个数据
     *
     * @param tableId 表单id
     * @param query   查询条件
     * @param throwEx 查询到多个数据是否报错（true 报错，false 忽略）
     * @return {@link JSONObject}
     */
    default JSONObject getOne(String tableId, FlyQiuQueryWrapper query, boolean throwEx) {
        return getOne(getTableConfigModel(tableId), query, throwEx);
    }

    /**
     * 获取一个数据
     *
     * @param config 表单配置
     * @param query  查询条件
     * @return {@link JSONObject}
     */
    default JSONObject getOne(FlyQiuTableConfig config, FlyQiuQueryWrapper query) {
        return getOne(config, query, true);
    }

    /**
     * 获取一个数据
     *
     * @param config  表单配置
     * @param query   查询条件
     * @param throwEx 查询到多个数据是否报错（true 报错，false 忽略）
     * @return {@link JSONObject}
     */
    default JSONObject getOne(FlyQiuTableConfig config, FlyQiuQueryWrapper query, boolean throwEx) {
        long count = count(config, query);
        if (count < 1) return null;
        if (count > 1 && throwEx) throw new TooManyResultsException();
        List<JSONObject> list = list(config, query);
        return list.get(0);
    }

    /**
     * 保存表数据
     *
     * @param tableId 表单id
     * @param data    需要保存的数据
     * @return 返回数据Id
     */
    default String save(String tableId, JSONObject data) {
        return save(getTableConfigModel(tableId), data);
    }

    /**
     * 保存表数据
     *
     * @param config 表单配置
     * @param data   需要保存的数据
     * @return {@link String} 返回的数据id
     */
    String save(FlyQiuTableConfig config, JSONObject data);

    /**
     * 根据id修改数据
     *
     * @param tableId 数据表id
     * @param dataId  数据id
     * @param data    需要修改的数据
     * @return boolean true成功 false失败
     */
    default boolean updateById(String tableId, String dataId, JSONObject data) {
        return updateById(getTableConfigModel(tableId), dataId, data);
    }

    /**
     * 根据id修改数据
     *
     * @param config 表单配置
     * @param dataId 数据id
     * @param data   需要修改的数据
     * @return boolean true成功 false失败
     */
    default boolean updateById(FlyQiuTableConfig config, String dataId, JSONObject data) {
        FlyQiuQueryWrapper wrapper = new FlyQiuQueryWrapper();
        wrapper.eq(COLUMN_PK_NAME, dataId);
        return update(config, data, wrapper) > 0;
    }

    /**
     * 修改数据
     *
     * @param tableId      表单id
     * @param data         需要修改的数据
     * @param queryWrapper 修改条件
     * @return long 修改数量
     */
    default long update(String tableId, JSONObject data, FlyQiuQueryWrapper queryWrapper) {
        return update(getTableConfigModel(tableId), data, queryWrapper);
    }

    /**
     * 修改数据
     *
     * @param config       表单配置
     * @param data         需要修改的数据
     * @param queryWrapper 修改条件
     * @return long 修改数量
     */
    long update(FlyQiuTableConfig config, JSONObject data, FlyQiuQueryWrapper queryWrapper);

    /**
     * 根据数据id删除数据
     *
     * @param tableId 表单id
     * @param dataId  数据id
     * @return boolean true 删除成功 false 删除失败
     */
    default boolean removeById(String tableId, String dataId) {
        return removeById(getTableConfigModel(tableId), dataId);
    }

    /**
     * 根据数据id删除数据
     *
     * @param config 表单配置
     * @param dataId 数据id
     * @return boolean true 删除成功 false 删除失败
     */
    default boolean removeById(FlyQiuTableConfig config, String dataId) {
        if (StringUtils.isEmpty(dataId)) throw new FlyQiuFormException("dataId is not null or dataId is not empty");
        FlyQiuQueryWrapper wrapper = new FlyQiuQueryWrapper();
        wrapper.eq(COLUMN_PK_NAME, dataId);
        remove(config, wrapper);
        return true;
    }

    /**
     * 根据条件删除数据
     *
     * @param tableId      数据表id
     * @param queryWrapper 查询条件
     * @return long 删除数量
     */
    default long remove(String tableId, FlyQiuQueryWrapper queryWrapper) {
        return remove(getTableConfigModel(tableId), queryWrapper);
    }

    /**
     * 根据条件删除数据
     *
     * @param config       数据表配置
     * @param queryWrapper 删除条件
     * @return long 删除数量
     */
    long remove(FlyQiuTableConfig config, FlyQiuQueryWrapper queryWrapper);

    /**
     * 查询数据数量
     *
     * @param tableId 数据表id
     * @return long 数据数量
     */
    default long count(String tableId) {
        return count(getTableConfigModel(tableId));
    }

    /**
     * 查询数据数量
     *
     * @param config 表单配置
     * @return 数据数量
     */
    default long count(FlyQiuTableConfig config) {
        return count(config, new FlyQiuQueryWrapper());
    }

    /**
     * 查询数据数量
     *
     * @param config       数据表配置
     * @param queryWrapper 查询条件
     * @return 数据数量
     */
    long count(FlyQiuTableConfig config, FlyQiuQueryWrapper queryWrapper);


}
